package com.cineplanet.dew.web;

import java.io.IOException;
import java.io.PrintWriter;
import java.util.Date;
import java.util.ArrayList;
import java.util.List;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.servlet.mvc.multiaction.MultiActionController;

import sun.security.jgss.spi.MechanismFactory;

import com.cineplanet.dew.exception.DAOExcepcion;
import com.cineplanet.dew.modelo.CarritoCompra;
import com.cineplanet.dew.modelo.CarritoCompraEntrada;
import com.cineplanet.dew.modelo.Cine;
import com.cineplanet.dew.modelo.Pelicula;
import com.cineplanet.dew.modelo.Usuario;
import com.cineplanet.dew.modelo.Merchandizing;
import com.cineplanet.dew.modelo.Producto;
import com.cineplanet.dew.service.CarritoComprasEntradaService;
import com.cineplanet.dew.service.CarritoCompraService;
import com.cineplanet.dew.service.CineService;
import com.cineplanet.dew.service.MerchandizingService;
import com.cineplanet.dew.service.PeliculaService;

public class CarritoComprasController extends MultiActionController{

private PeliculaService peliculaService;
	
	public PeliculaService getPeliculaService() {
		return peliculaService;
	}

	public void setPeliculaService(PeliculaService peliculaService) {
		this.peliculaService = peliculaService;
	}

	private CineService cineService;
	
	public CineService getCineService() {
		return cineService;
	}

	public void setCineService(CineService cineService) {
		this.cineService = cineService;
	}
	
	private CarritoCompraService carritoCompraService;

	public CarritoCompraService getCarritoCompraService() {
		return carritoCompraService;
	}

	public void setCarritoCompraService(CarritoCompraService carritoCompraService) {
		this.carritoCompraService = carritoCompraService;
	}

	private CarritoComprasEntradaService carritoComprasEntradaService;
	
	public CarritoComprasEntradaService getCarritoComprasEntradaService() {
		return carritoComprasEntradaService;
	}

	public void setCarritoComprasEntradaService(
			CarritoComprasEntradaService carritoComprasEntradaService) {
		this.carritoComprasEntradaService = carritoComprasEntradaService;
	}

	private MerchandizingService merchandizingService;
	
	public MerchandizingService getMerchandizingService() {
		return merchandizingService;
	}

	public void setMerchandizingService(MerchandizingService merchandizingService) {
		this.merchandizingService = merchandizingService;
	}

	/**************************************************************************************************/
	
	@SuppressWarnings("unchecked")
	public ModelAndView comprarEntradas(HttpServletRequest request,HttpServletResponse response)  {
		HttpSession session = request.getSession();
		
		List<Integer> butacas = new ArrayList<Integer>();
		List<Producto> productos = new ArrayList<Producto>();
		List<Merchandizing> merchandizings = new ArrayList<Merchandizing>();
		
		if(session.getAttribute("BUTACAS_COMPRADAS") != null)
			butacas = (List<Integer>)session.getAttribute("BUTACAS_COMPRADAS");
		
		if(session.getAttribute("PRODUCTOS_COMPRADOS") != null)
			productos = (List<Producto>)session.getAttribute("PRODUCTOS_COMPRADOS");
		
		if(session.getAttribute("MERCHANDIZINGS_COMPRADOS") != null)
			merchandizings = (List<Merchandizing>)session.getAttribute("MERCHANDIZINGS_COMPRADOS");
		
		
		session.setAttribute("BUTACAS_COMPRADAS", butacas);
		session.setAttribute("PRODUCTOS_COMPRADOS", productos);
		session.setAttribute("MERCHANDIZINGS_COMPRADOS", merchandizings);
		
		try {
			List<Cine> cines = cineService.listar();
			
			request.setAttribute("cines", cines);
		} catch (DAOExcepcion e) {
			e.printStackTrace();
		}
	
       return new ModelAndView("carritoEntradas");
    }
	
	@SuppressWarnings("unchecked")
	public ModelAndView agregarButaca(HttpServletRequest request,HttpServletResponse response)  {
		
		int numeroButaca =  Integer.parseInt(request.getParameter("numeroButaca"));
		List<Integer> butacas = new ArrayList<Integer>();
		HttpSession session = request.getSession();
		
		if(session.getAttribute("BUTACAS_COMPRADAS") != null){
			butacas = (List<Integer>)session.getAttribute("BUTACAS_COMPRADAS");
		}
		
		butacas.add(numeroButaca);
	
       return null;
    }
	
	@SuppressWarnings("unchecked")
	public ModelAndView guardarButacas(HttpServletRequest request,HttpServletResponse response)  {
		List<Integer> butacas = new ArrayList<Integer>();
		CarritoCompraEntrada carritoCompraEntrada;
		
		HttpSession session = request.getSession();
		int idUsuario =((Usuario)session.getAttribute("USUARIO_CARRITO")).getIdUsuario();
		int idCine =  Integer.parseInt(request.getParameter("cboCines"));
		int idPelicula =  Integer.parseInt(request.getParameter("cboPeliculas"));
		
		if(session.getAttribute("BUTACAS_COMPRADAS") != null){
			butacas = (List<Integer>)session.getAttribute("BUTACAS_COMPRADAS");
		}
	
		updateCantidadProductoEntrada(butacas.size(),8.50,session);
		
		for(int i : butacas){
			carritoCompraEntrada = new CarritoCompraEntrada();
			carritoCompraEntrada.setIdCine(idCine);
			carritoCompraEntrada.setIdPelicula(idPelicula);
			carritoCompraEntrada.setIdUsuario(idUsuario);
			carritoCompraEntrada.setNuButaca(i);
			carritoCompraEntrada.setNuPrecioEntrada(10.00);
			
			try {
				
				carritoComprasEntradaService.insertar(carritoCompraEntrada);
				request.setAttribute("mensajeCompra", butacas.size() +  "Compradas con Exito");
			} catch (DAOExcepcion e) {
				e.printStackTrace();
			}
		}		
	
       return new ModelAndView("redirect:/carritoCompras.htm?metodo=comprarEntradas");
    }

	public ModelAndView mostrarPeliculasPorCine(HttpServletRequest request, HttpServletResponse response) {
		
        int idCine = Integer.parseInt(request.getParameter("idCine"));
       
        try {
        	List<Pelicula> peliculas = (ArrayList<Pelicula>)peliculaService.listarPeliculasPorCine(idCine);	
        	PrintWriter out = response.getWriter();
        	
        	out.println("<select name=\"cboPeliculas\" >");
        	out.println("<option value=\"0\">Seleccione</option>");
        	for(Pelicula pela : peliculas){
        		out.println("<option value=\"" + pela.getIdPelicula() + "\">"+ pela.getNombre()+ "</option>");
        	}
        	out.println("</select>");

        } catch (DAOExcepcion e) {
            System.err.println("Error");
        } catch (IOException e) {
			e.printStackTrace();
		}
        
        return null;
    }
	
	private void updateCantidadProductoEntrada(int cantidad, double precio, HttpSession session){
		
		int itemsActuales = 0;
		double totalVendidoActual = 0.0;
		
		if(session.getAttribute("cantidadItemsCarro") == null)
			session.setAttribute("cantidadItemsCarro", itemsActuales);
		if(session.getAttribute("totalCompras") == null)
			session.setAttribute("totalCompras", totalVendidoActual);
		
		itemsActuales = Integer.parseInt(session.getAttribute("cantidadItemsCarro").toString()) + cantidad;
		totalVendidoActual = Double.parseDouble(session.getAttribute("totalCompras").toString()) + (cantidad * precio );
		
		session.removeAttribute("cantidadItemsCarro");
		session.removeAttribute("totalCompras");
		
		session.setAttribute("cantidadItemsCarro", itemsActuales);
		session.setAttribute("totalCompras", totalVendidoActual);
		
	}

	/************************************************************************************************/
	
	public ModelAndView comprarMerchandizing(HttpServletRequest request,HttpServletResponse response)  {
		
		HttpSession session = request.getSession();
		List<Merchandizing> productosVendidos;
        
        if(session.getAttribute("PRODUCTOS_COMPRADOS") == null)
			session.setAttribute("PRODUCTOS_COMPRADOS", new ArrayList<Merchandizing>());
        
        productosVendidos = (ArrayList<Merchandizing>)session.getAttribute("PRODUCTOS_COMPRADOS");
		
		try {
			List<Pelicula> peliculas = peliculaService.listar();
			
			request.setAttribute("peliculas", peliculas);
		} catch (DAOExcepcion e) {
			e.printStackTrace();
		}
		
		return new ModelAndView("carritoMerchandizing");
	}
	
	public ModelAndView mostrarMerchandizing(HttpServletRequest request,HttpServletResponse response)  {

        int idPelicula= Integer.parseInt(request.getParameter("idPelicula"));		
		System.out.println("IdPela: " + idPelicula);
		
		try {
			List<Merchandizing> productos = (List<Merchandizing>)merchandizingService.obtenerMerchandizing(idPelicula);
			System.out.println("productos longitud: " + productos.size());
			
			PrintWriter out = response.getWriter();
			System.out.println("recupero el out");
        	out.println("<select name=\"cboMerchandizing\" >");
        	out.println("<option value=\"0\">Seleccione</option>");
        	for(Merchandizing mercha : productos){
        		out.println("<option value=\"" + mercha.getIdProducto() + "\" onclick=\"cargarPrecio(" + mercha.getIdProducto() + ")\">" + mercha.getNombreProducto() + "</option>");
        	}
        	out.println("</select>");
        	
		} catch (DAOExcepcion e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		}
		
		return null;
	}
	
	public ModelAndView obtenerPrecioMercha(HttpServletRequest request,HttpServletResponse response)  {
		int idProducto = Integer.parseInt(request.getParameter("idProducto"));
		
		try {
			PrintWriter out = response.getWriter();
			
			Merchandizing merchandizing = merchandizingService.obtenerMerchandizingUnico(idProducto);
			
			out.println(String.valueOf(merchandizing.getPrecio()));
		} catch (DAOExcepcion e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		
		return null;
	}
	
	public ModelAndView guardarVentasMerchandizing(HttpServletRequest request,HttpServletResponse response)  {

        int idProducto = Integer.parseInt(request.getParameter("cboMerchandizing"));
        int nuCantidadProducto = Integer.parseInt(request.getParameter("cantidadMerchandizing"));
        
        HttpSession session = request.getSession();
        List<Merchandizing> productosVendidos;
        
        if(session.getAttribute("PRODUCTOS_COMPRADOS") == null)
			session.setAttribute("PRODUCTOS_COMPRADOS", new ArrayList<Merchandizing>());
        
        productosVendidos = (ArrayList<Merchandizing>)session.getAttribute("PRODUCTOS_COMPRADOS");
        
        Usuario usuario = (Usuario)session.getAttribute("USUARIO_CARRITO");
		CarritoCompra carritoCompra =  new CarritoCompra();
		carritoCompra.setFeCompra(new Date());
		carritoCompra.setIdProducto(idProducto);
		carritoCompra.setNuCantidadProducto(nuCantidadProducto);
		carritoCompra.setUsuario(usuario);
		
		try {
			Merchandizing merchandizing = merchandizingService.obtenerMerchandizingUnico(idProducto);
			carritoCompra.setNuSubtotal(nuCantidadProducto * merchandizing.getPrecio() );			
			
			List<Pelicula> peliculas = peliculaService.listar();
			
			carritoCompraService.insertar(carritoCompra);
			productosVendidos.add(merchandizing);
			updateCantidadProductoEntrada(nuCantidadProducto,merchandizing.getPrecio(),session);
			
			request.setAttribute("peliculas", peliculas);
		} catch (DAOExcepcion e) {
			e.printStackTrace();
		}
		
		return new ModelAndView("carritoMerchandizing");
	}
}
